package com.sykj.why.mongo.service.impl;

import com.sykj.why.exception.WhyException;
import com.sykj.why.mongo.dao.ContentConfigTDao;
import com.sykj.why.mongo.document.entity.ContentConfigT;
import com.sykj.why.mongo.dto.PageDTO;
import com.sykj.why.mongo.enums.exception.ResultEnum;
import com.sykj.why.mongo.service.ContentConfigTService;
import com.sykj.why.mongo.vo.entity.ContentConfigTVo;
import com.sykj.why.util.BaseTools;
import com.sykj.why.util.DateTool;
import com.sykj.why.util.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Eleven
 * @date 2019/6/4
 * @desc 内容自定义字段业务实现层
 */

@Service("ContentConfigTService")
public class ContentConfigTServiceImpl extends BasicServiceImpl<ContentConfigT> implements ContentConfigTService {

    @Autowired
    private ContentConfigTDao contentConfigTDao;

    /**
     * 添加内容自定义字段
     * @param contentConfigT
     */
    @Override
    public void saveContentConfig(ContentConfigT contentConfigT) {
        //验证内容自定义字段名称是否重复
        verifyName(contentConfigT);
        //排序
        long count = contentConfigTDao.count(ContentConfigT.class, false);
        contentConfigT.setSort((int) count);
        //设置时间
        contentConfigT.setCreateTime(DateTool.getSystemTime());
        contentConfigT.setUpdateTime(DateTool.getSystemTime());
        //保存
        contentConfigTDao.save(contentConfigT);
    }

    /**
     * 删除内容自定义字段
     * @param id
     */
    @Override
    public void removeContentConfig(String id) {
        //通过Id查询内容自定义字段
        ContentConfigT contentConfigT = findById(id);
        //逻辑删除内容自定义字段
        contentConfigTDao.remove(contentConfigT);
    }

    /**
     * 修改内容自定义字段
     * @param contentConfigT
     */
    @Override
    public void updateContentConfig(ContentConfigT contentConfigT) {
        //通过id查询内容自定义字段
        ContentConfigT contentConfig = findById(contentConfigT.getId());
        //重新赋值
        //验证内容自定义字段名称是否重复
        verifyName(contentConfigT);
        contentConfig.setColumnName(contentConfigT.getColumnName());
        contentConfig.setColumnType(contentConfigT.getColumnType());
        contentConfig.setColumnLabel(contentConfigT.getColumnLabel());
        contentConfig.setUpdateTime(DateTool.getSystemTime());
        //保存或修改
        contentConfigTDao.saveOrupdate(contentConfig);
    }

    /**
     * 启用/禁用内容自定义字段
     * @param id
     * @param flag
     */
    @Override
    public void disableOrEnable(String id, boolean flag) {
        //通过id查询内容自定义字段
        ContentConfigT contentConfigT = findById(id);
        //修改状态
        contentConfigTDao.disableOrEnable(contentConfigT,flag);
    }

    /**
     * 验证内容自定义字段名称是否重复
     * @param contentConfigT
     */
    @Override
    public void verifyName(ContentConfigT contentConfigT) {
        Query query = new Query();
        query.addCriteria(Criteria.where("id").ne(contentConfigT.getId()).
                and("columnName").is(contentConfigT.getColumnName()).and("removed").is(false));
        ContentConfigT contentConfig = contentConfigTDao.findOne(query,ContentConfigT.class);
        if (contentConfig != null) {
            throw new WhyException(ResultEnum.REPEAT);
        }
    }

    /**
     * 通过id查询内容自定义字段
     * @param id
     * @return
     */
    @Override
    public ContentConfigT findById(String id) {
        //通过id查询未删除的内容自定义字段
        Query query = new Query();
        query.addCriteria(Criteria.where("id").is(id).and("removed").is(false));
        ContentConfigT contentConfigT = contentConfigTDao.findOne(query,ContentConfigT.class);
        if (contentConfigT!=null){
            return contentConfigT;
        }else {
            throw new WhyException(ResultEnum.OBJISNULL);
        }
    }

    /**
     * 查询所有内容自定义字段
     * @return
     */
    @Override
    public List<ContentConfigT> findAll() {
        //查询未删除和未禁用的所有内容自定义字段
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false).and("enable").is(true));
        List<ContentConfigT> list = contentConfigTDao.findAll(query,ContentConfigT.class);
        return list;
    }

    /**
     * 分页查询内容自定义字段
     * @param pageDTO
     * @return
     */
    @Override
    public Page findByPage(PageDTO pageDTO) {
        //查询未删除的内容自定义字段，并分页传给视图
        Query query = new Query();
        query.addCriteria(Criteria.where("removed").is(false));
        long count = contentConfigTDao.count(query, ContentConfigT.class);
        List<ContentConfigTVo> list = new ArrayList<>();
        for (ContentConfigT contentConfigT : contentConfigTDao.findByPage(query, pageDTO, ContentConfigT.class)) {
            ContentConfigTVo vo = new ContentConfigTVo();
            BeanUtils.copyProperties(contentConfigT, vo);
            vo.setCreateTime(BaseTools.longToString(contentConfigT.getCreateTime()));
            vo.setUpdateTime(BaseTools.longToString(contentConfigT.getUpdateTime()));
            list.add(vo);
        }
        return new Page(pageDTO, count, list);
    }
}
